#ifndef CPU_H
#define CPU_H

#include <QMap>
#include <QVector>
#include <QString>
#include <QStringList>
#include "interruptmanager.h"

class CPU
{
public:
    CPU(InterruptManager* interruptManager);
    ~CPU();
    
    // 寄存器操作
    int getRegister(const QString& regName) const;
    void setRegister(const QString& regName, int value);
    
    // 内存操作
    int getMemory(int address) const;
    void setMemory(int address, int value);
    
    // 执行控制
    void executeInstruction(const QString& instruction);
    void reset();
    
    // 中断相关
    void triggerInterrupt(int interruptNumber);
    bool isHalted() const;
    
private:
    // 寄存器集合
    QMap<QString, int> registers;
    
    // 内存
    QVector<int> memory;
    
    // 程序计数器
    int pc;
    
    // 标志寄存器
    int flags; // ZF(零标志), SF(符号标志), CF(进位标志), OF(溢出标志)
    
    // 中断管理器
    InterruptManager* interruptManager;
    
    // 指令执行函数
    void executeMOV(const QStringList& operands);
    void executeADD(const QStringList& operands);
    void executeSUB(const QStringList& operands);
    void executeMUL(const QStringList& operands);
    void executeDIV(const QStringList& operands);
    void executeCMP(const QStringList& operands);
    void executeJMP(const QStringList& operands);
    void executeJE(const QStringList& operands);
    void executeJNE(const QStringList& operands);
    void executeJG(const QStringList& operands);
    void executeJL(const QStringList& operands);
    void executeINT(const QStringList& operands);
    void executePUSH(const QStringList& operands);
    void executePOP(const QStringList& operands);
    void executeCALL(const QStringList& operands);
    void executeRET(const QStringList& operands);
    void executeINC(const QStringList& operands);
    void executeDEC(const QStringList& operands);
    void executeAND(const QStringList& operands);
    void executeOR(const QStringList& operands);
    void executeXOR(const QStringList& operands);
    void executeNOT(const QStringList& operands);
    void executeSHL(const QStringList& operands);
    void executeSHR(const QStringList& operands);
    
    // 辅助函数
    bool parseOperand(const QString& operand, int& value, bool& isRegister);
    void setFlags(int result, bool isSubtract = false);
    bool isRegister(const QString& regName) const;
    
    // 执行状态
    bool halted;
};

#endif // CPU_H    